#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef enum { false, true } bool;
typedef int ElemSet; /* 默认矩阵元素为整型 */
typedef struct MatrixNode *Matrix;
struct MatrixNode {
    ElemSet **t;
    int row;
    int col;
};

ElemSet **Create2DArray(int row, int col) {
    /* 动态声明row行col列的二维数组 */
    ElemSet *a, **t;
    int i;

    a = (ElemSet *)malloc(sizeof(ElemSet) * row * col);
    t = (ElemSet **)malloc(sizeof(ElemSet *) * row);
    for (i = 0; i < row; i++)
        t[i] = &a[col * i];
    return t;
}

void Free2DArray(ElemSet **t) {
    /* 释放二维数组空间 */
    free(t[0]);
    free(t);
}

void Print(int *s, int n) {
    /* 输出一组解 */
    int i;

    printf("(%d", s[0] + 1);
    for (i = 1; i < n; i++) {
        printf(", %d", s[i] + 1);
    }
    printf(")\n");
}

/* 算法15-4：分书问题的递归枚举算法 BookAssignmentBF (table, s, i, n, m) */
void BookAssignmentBF(Matrix table, int *s, int i, int n, int m) {
    bool result;
    int j;

    if (i == n) { /* 完成了一组状态的枚举 */
        result = true;
        for (i = 0; i < n; i++) { /* 检查条件（1）*/
            for (j = 0; j < n; j++) {
                if (i != j && s[i] == s[j]) { /* 不同的人分到了同一本书 */
                    result = false;
                    break;
                }
            }
            if (result == false) {
                break;
            }
        }
        if (result == true) { /* 条件（1）满足, 检查条件（2）*/
            for (i = 0; i < n; i++) {
                if (table->t[i][s[i]] != 1) { /* 第 i 个人不喜欢自己分到的书 */
                    result = false;
                    break;
                }
            }
        }
        if (result == true) { /* 条件（1）和（2）都满足 */
            Print(s, n);
        }
    } else {
        for (s[i] = 0; s[i] < m; s[i]++) {
            BookAssignmentBF(table, s, i + 1, n, m);
        }
    }
}
/* 算法15-4 结束 */

int main(void) {
    Matrix table;
    int *s; /* 解的状态分量 */
    int n, m, i, j;

    scanf("%d %d", &n, &m);
    table = (Matrix)malloc(sizeof(struct MatrixNode));
    table->row = n;
    table->col = m;
    table->t = Create2DArray(table->row, table->col);
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            scanf("%d", &table->t[i][j]);
        }
    }
    s = (int *)malloc(sizeof(int) * n);
    BookAssignmentBF(table, s, 0, n, m);
    Free2DArray(table->t);
    free(table);

    return 0;
}